<?php

/**
 * Représente une action
 *
 * @package cass
 * @author Mickaël CASTANHEIRO <mickael.castanheiro@gmail.com>
 * @version 1.0
 */

namespace cass;

abstract class Action extends Element {

    protected $parameters;
    protected $doctrine;

    /**
     * Constructeur de l'Action
     */
    public function __construct() {
        $this->parameters = new Parameters;
        $this->init();
        $this->doctrine = Doctrine::getInstance();
    }

    /**
     * Fonction init par défaut ne fait rien
     * mais peut être surchargée dans les actions
     */
    public function init() {}

    /**
     * Assigne une variable aux paramètres
     * @param String $_name Nom de la variable
     * @param <mixed> $_value Valeur de la variable
     */
    public function __set($_name, $_value) {
        $this->parameters->addToVars($_name, $_value);
    }

    /**
     * Assigne une variable aux paramètres
     * @param String $_name Nom de la variable
     * @param <mixed> $_value Valeur de la variable
     */
    public function __get($_name) {
        return $this->parameters->getVars($_name);
    }

    /**
     * Titre de la page
     * @param String Titre
     */
    public function setTitle($_title) {
        $this->parameters->setTitle($_title);
    }

    /**
     * Titre de la page
     * @param String Titre
     */
    public function addToAriane($_name, $_link) { 
       $this->parameters->addToAriane($_name, $_link);
    }

    /**
     * Titre de la page
     * @param String Titre
     */
    public function addToCss($_link) {
        $this->parameters->addToCss($_link);
    }

    /**
     * Titre de la page
     * @param String Titre
     */
    public function addToJs($_link) {
        $this->parameters->addToJs($_link);
    }

    /**
     * Retourne l'objet de session
     * @return Session Session courante
     */
    public function getSession() {
        return Session::getInstance();
    }


    /**
     * Transmet la page
     * @param <mixed> Paramètres relatifs à la construction de l'url
     */
    public function forward() {
        return call_user_func_array(array(FrontController::getInstance(), 'forward'), func_get_args());
    }

    /**
     * Redirige vers une action
     * @param Paramètres relatifs à la construction de l'url
     */
    public function redirect() {

        return call_user_func_array(array(FrontController::getInstance(), 'redirect'), func_get_args());
    }

    /**
     * Redirige la page vers une URL
     * @param String $_url URL relative de redirection
     */
    public function redirectUrl() {
        call_user_func_array(array(FrontController::getInstance(), 'redirectUrl'), func_get_args());
    }
    
    /**
     * Transmet la page à condition...
     * @param <boolean> condition doit être vraie pour que la redirection soit prise en compte
     * @param <mixed> Paramètres relatifs à la construction de l'url
     */
    public function forwardIf() {
        $args = func_get_args();
        if (empty($args) OR sizeof($args) < 2) {
            throw new SyntaxException('Le nombre d\'arguments de forwardIf est insuffisant');
        }

        if ($args[0] === true) {
            call_user_func_array(array($this, 'forward'), array_slice($args, 1));
        }
    }

    /**
     * Transmet la page à !condition...
     * @param <boolean> condition doit être fausse pour que la redirection soit prise en compte
     * @param <mixed> Paramètres relatifs à la construction de l'url
     */
    public function forwardEven() {
        $args = func_get_args();
        $args[0] = !$args[0];
        call_user_func_array(array($this, 'forwardIf'), $args);
    }


    /**
     * Redirige la page à condition...
     * @param <boolean> condition doit être vraie pour que la redirection soit prise en compte
     * @param <mixed> Paramètres relatifs à la construction de l'url
     */
    public function redirectIf() {
        $args = func_get_args();
        if (empty($args) OR sizeof($args) < 2) {
            throw new SyntaxException('Le nombre d\'arguments de forwardIf est insuffisant');
        }

        if ($args[0] === true) {
            call_user_func_array(array($this, 'redirect'), array_slice($args, 1));
        }
    }

    /**
     * Transmet la page à !condition...
     * @param <boolean> condition doit être fausse pour que la redirection soit prise en compte
     * @param <mixed> Paramètres relatifs à la construction de l'url
     */
    public function redirectEven() {
        $args = func_get_args();
        $args[0] = !$args[0];
        call_user_func_array(array($this, 'redirectIf'), $args);
    }

}

?>
